#ifndef DEVICEMODEL_H
#define DEVICEMODEL_H

#include <QAbstractListModel>
#include <QList>
#include "entities/Device.h"

/**
 * @brief 设备列表模型
 * @details 继承 QAbstractListModel，为 QML 提供设备列表数据：
 *          - 从数据库加载设备列表
 *          - 支持添加、删除、更新设备
 *          - 自动通知 QML 界面刷新
 *          - 提供设备状态查询
 */
class DeviceModel : public QAbstractListModel
{
    Q_OBJECT
    Q_PROPERTY(int count READ count NOTIFY countChanged)

public:
    // 角色枚举（对应 QML 中的属性）
    enum DeviceRoles
    {
        DeviceIdRole = Qt::UserRole + 1, // 设备ID
        DeviceNameRole,                  // 设备名称
        IpAddressRole,                   // IP地址
        PortRole,                        // 端口
        SlaveIdRole,                     // 从站ID
        StatusRole,                      // 状态
        LastUpdateRole,                  // 最后更新时间
        DescriptionRole                  // 描述
    };
    Q_ENUM(DeviceRoles)

    explicit DeviceModel(QObject *parent = nullptr);
    ~DeviceModel();

    // QAbstractListModel 必须实现的方法
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    QHash<int, QByteArray> roleNames() const override;

    // 设备数量
    int count() const { return m_devices.count(); }

    // 从数据库加载设备列表
    Q_INVOKABLE bool loadFromDatabase();

    // 添加设备
    Q_INVOKABLE bool addDevice(const QString &deviceId,
                               const QString &deviceName,
                               const QString &ipAddress,
                               int port = 502,
                               int slaveId = 1,
                               const QString &description = QString());

    // 删除设备
    Q_INVOKABLE bool removeDevice(const QString &deviceId);
    Q_INVOKABLE bool removeDeviceAt(int index);

    // 更新设备信息
    Q_INVOKABLE bool updateDevice(const QString &deviceId,
                                  const QString &deviceName,
                                  const QString &ipAddress,
                                  int port,
                                  int slaveId,
                                  const QString &description);

    // 更新设备状态
    Q_INVOKABLE bool updateDeviceStatus(const QString &deviceId, const QString &status);

    // 获取设备
    Q_INVOKABLE Device getDevice(int index) const;
    Q_INVOKABLE Device getDeviceById(const QString &deviceId) const;

    // 查找设备索引
    Q_INVOKABLE int findDeviceIndex(const QString &deviceId) const;

    // 检查设备是否存在
    Q_INVOKABLE bool deviceExists(const QString &deviceId) const;

    // 获取在线设备数量
    Q_INVOKABLE int getOnlineCount() const;

    // 清空列表
    Q_INVOKABLE void clear();

signals:
    // 设备数量变化信号
    void countChanged();

    // 设备添加信号
    void deviceAdded(const QString &deviceId);

    // 设备删除信号
    void deviceRemoved(const QString &deviceId);

    // 设备更新信号
    void deviceUpdated(const QString &deviceId);

private:
    // 保存设备到数据库
    bool saveToDatabase(const Device &device);

    // 从数据库删除设备
    bool deleteFromDatabase(const QString &deviceId);

private:
    QList<Device> m_devices; // 设备列表
};

#endif // DEVICEMODEL_H
